package com.tulele.vtool.wechat.token.server;

import com.google.common.collect.Maps;
import com.tulele.vtool.wechat.token.AccessToken;
import com.tulele.vtool.wechat.token.common.Config;

import java.util.Map;

/**
 * AccessToken 中控服务器
 */
public class AccessTokenMemServer {
    /**
     * 公众号 AccessToken 缓存
     */
    private static Map<String, AccessToken> tokenMap = Maps.newHashMapWithExpectedSize(30);

    private static int requestTimes = 1;

    /**
     * 获取 AccessToken
     * @param gzhCode 公众号标识
     * @param appId
     * @param secret
     * @return
     */
    public static String getAccessToken(String gzhCode, String appId, String secret) {
        AccessToken accessToken = null;
        if (tokenMap.containsKey(gzhCode)) {// 如果缓存中存在，则直接获取
            accessToken = tokenMap.get(gzhCode);
            if (!accessToken.isValid()) {// 验证
                refresh(accessToken);
            }
        } else {// 如果缓存中不存在，则请求微信服务器获取，并存入缓存
            accessToken = new AccessToken(new Config(appId, secret));
            refresh(accessToken);
            tokenMap.put(gzhCode, accessToken);
        }
        return accessToken.getToken();
    }

    /**
     * 刷新 AccessToken
     * @param accessToken
     */
    public static void refresh(AccessToken accessToken) {
        for(int i = 0; i < requestTimes && !accessToken.request(); ++i) {
        }
    }

    /**
     * 刷新已缓存的公众号 AccessToken
     * 主要用于定时任务
     * com.tulele.vtool.wechat.token.task.AccessTokenTask
     */
    public static void refreshAll() {
        if (!tokenMap.isEmpty()) {
            for (String key : tokenMap.keySet()) {
                refresh(tokenMap.get(key));
            }
        }
    }
}
